import java.util.HashMap;

import _Banque.*;
import _Tests.Tests;
import _Utils.Data;
import _Exception.*;

/**
 * Operations bancaire du 15/12/11
 * @author V. Loïc
 */
public class TV_Banque_15
{
	public static void main(String[] args) throws Exception
	{
		Tests.Begin("Validation de la banque", "1.1.0");
		
		Tests.Design("Operations bancaires du 15/12/11", 3);
		
		// --- on recupere la banque de la veille et les titulaires
		Banque banque = (Banque) Data.load("banque_14", "1.1.0");
		HashMap<String, Titulaire> titulaires = (HashMap<String, Titulaire>) Data.load("titulaires", "1.1.0");
		
		AgenceBancaire agenceNice = banque.getAgence(1001);
		AgenceBancaire agenceJuans = banque.getAgence(1002);
		
		Titulaire val = titulaires.get("valentin");
		Titulaire quentin = titulaires.get("quentin");
		Titulaire antho = titulaires.get("anthony");
		Titulaire modou = titulaires.get("modou");
		Titulaire ju = titulaires.get("julien");
		Titulaire flo = titulaires.get("florian");
		Titulaire lolo = titulaires.get("lorris");
		Titulaire toto = titulaires.get("thomas");
		Titulaire kevin = titulaires.get("kevinS");
		Titulaire anais = titulaires.get("anais");
		Titulaire lucas = titulaires.get("lucas");
		
		CompteEpargne ceModou = (CompteEpargne) agenceNice.compteBancaire(4000001);
		CompteEpargne ceQuentin = (CompteEpargne) agenceNice.compteBancaire(4000002);
		CompteEpargne ce2Quentin = (CompteEpargne) agenceNice.compteBancaire(4000003);
		CompteEpargne ceLucas = (CompteEpargne) agenceNice.compteBancaire(4000004);
		CompteEpargne ceToto = (CompteEpargne) agenceNice.compteBancaire(4000005);
		CompteEpargne ceKevin = (CompteEpargne) agenceNice.compteBancaire(4000006);
		
		CompteCourant ccQuentin = (CompteCourant) agenceNice.compteBancaire(8000001);
		CompteCourant ccVal = (CompteCourant) agenceNice.compteBancaire(8000002);
		CompteCourant ccJu = (CompteCourant) agenceNice.compteBancaire(8000003);
		CompteCourant ccFlo = (CompteCourant) agenceNice.compteBancaire(8000004);
		CompteCourant cc2Quentin = (CompteCourant) agenceJuans.compteBancaire(8000005);
		CompteCourant ccAntho = (CompteCourant) agenceNice.compteBancaire(8000006);
		CompteCourant ccLorris = (CompteCourant) agenceNice.compteBancaire(8000007);
		CompteCourant ccAnais = (CompteCourant)agenceNice.compteBancaire(8000008);

		
		Tests.Case("Verification des statistiques de la veille");
		{
		    Tests.Unit(1029946.6875, banque.totalDepots());
		    Tests.Unit(10, banque.nombreOperations("2011/12/14"));
        }

        Tests.Case("Operations de valentin");
        {
            ccVal.executer("retrait 9001", 'R', 9001);
            val.setAdresse("Nouvelle adresse");
            ccVal.cloturer();
        }
        
        Tests.Case("Operations de Quentin");
        {
            ccQuentin.executer("ajout de fonds", 'V', 2560);
            ccQuentin.executer("transfert d'argent pour modou", 'R', 257);
            ceModou.executer("virement depuis le compte de quentin", 'V', 257);
        }
        
        Tests.Case("Operations de Anthony");
        {
            long buffer = agenceNice.ouvrirCompte(antho);
            CompteCourant cc2Antho = (CompteCourant)agenceNice.compteBancaire(buffer);
            cc2Antho.executer("ajout 10e", 'V', 10);
        }
        
        Tests.Case("Operations de lorris");
        {
            Tests.Unit(150, ccLorris.getSoldeCompte());
            Tests.Unit("2011/12/14", ccLorris.getDateDerniereOperation());
        }
        
                
        Tests.Case("Operations de lucas");
        {
            ceLucas.executer("retrait 1", 'R', 89.50f);
            ceLucas.executer("retrait 2", 'R', 19.09f);
            ceLucas.executer("versement 2", 'V', 999.16f);
        }
        
        Tests.Case("Operations de thomas");
        {
            ceToto.executer("versement", 'V', 2000);
            ceToto.executer("retrait", 'R', 200);
            ceToto.executer("retrait a virgule", 'R', 95.03f);
            ceToto.executer("ultime retrait", 'R', 15);
        }
        
        Tests.Case("Operations de Kevin S.");
        {
            ceKevin.cloturer();
        }

		Tests.Case("Verification des statistiques de la journée");
		{
		    Tests.Unit(1021091.9375, banque.totalDepots());
		    Tests.Unit(14, banque.nombreOperations(_Banque.dateCourante()));
		}

		// --- enregistrement de la banque et des titulaires
		//Tests.Unit(true, Data.store(banque, "banque_15", "1.1.0"));
		//Tests.Unit(true, Data.store(titulaires, "titulaires", "1.1.0"));
		
		
		Tests.End();
	}

}
